home *** CD-ROM | disk | FTP | other *** search
/ Isometric Game Programming with DirectX 7.0 / Isometric Game Programming.iso / source / chapter16 / isohex16_1 / isohex16_1.cpp < prev    next >
C/C++ Source or Header  |  2000-08-07  |  10KB  |  405 lines

  1. /*****************************************************************************
  2. IsoHex16_1.cpp
  3. Ernest S. Pazera
  4. 07AUG2000
  5. Start a WIN32 Application Workspace, add in this file
  6. Requires the following libs:
  7. ddraw.lib, dxguid.lib
  8. Requires the following files:
  9. DDFuncs.h.cpp, GDICanvas.h/cpp, IsoMouseMap.h/cpp,
  10. IsoScroller.h/cpp, IsoTilePlotter.h/cpp, IsoTileWalker.h/cpp
  11. TileSet.h/cpp. IsoHexCore.h, IsoHexDefs.h
  12. *****************************************************************************/
  13.  
  14. //////////////////////////////////////////////////////////////////////////////
  15. //INCLUDES
  16. //////////////////////////////////////////////////////////////////////////////
  17. #define WIN32_LEAN_AND_MEAN  
  18.  
  19. #include <windows.h>  
  20. #include "DDFuncs.h"
  21. #include "TileSet.h"
  22. #include "IsoHexCore.h"
  23.  
  24.  
  25. //////////////////////////////////////////////////////////////////////////////
  26. //DEFINES
  27. //////////////////////////////////////////////////////////////////////////////
  28. //name for our window class
  29. #define WINDOWCLASS "ISOHEX16"
  30. //title of the application
  31. #define WINDOWTITLE "IsoHex 16-1"
  32.  
  33. const int MAPWIDTH=20;
  34. const int MAPHEIGHT=40;
  35.  
  36. //////////////////////////////////////////////////////////////////////////////
  37. //PROTOTYPES
  38. //////////////////////////////////////////////////////////////////////////////
  39. bool Prog_Init();//game data initalizer
  40. void Prog_Loop();//main game loop
  41. void Prog_Done();//game clean up
  42.  
  43. //////////////////////////////////////////////////////////////////////////////
  44. //GLOBALS
  45. //////////////////////////////////////////////////////////////////////////////
  46. HINSTANCE hInstMain=NULL;//main application handle
  47. HWND hWndMain=NULL;//handle to our main window
  48.  
  49. //directdraw
  50. LPDIRECTDRAW7 lpdd=NULL;
  51. LPDIRECTDRAWSURFACE7 lpddsMain=NULL;
  52. LPDIRECTDRAWSURFACE7 lpddsBack=NULL;
  53. LPDIRECTDRAWCLIPPER lpddClip=NULL;
  54.  
  55. //tilesets
  56. CTileSet tsBack;//background
  57. CTileSet tsShadow;//tree shadow
  58. CTileSet tsTree;//tree foreground
  59. CTileSet tsCursor;//cursor
  60.  
  61. //isohexcore components
  62. CTilePlotter TilePlotter;//plotter
  63. CTileWalker TileWalker;//walker
  64. CScroller Scroller;//scroller
  65. CMouseMap MouseMap;//mousemap
  66.  
  67. POINT ptCursor;//keep track of the cursor
  68. POINT ptScroll;//keep track of how quickly we scroll
  69.  
  70. int iMap[MAPWIDTH][MAPHEIGHT];//map array(0=no tree, 1=tree)
  71.  
  72. //////////////////////////////////////////////////////////////////////////////
  73. //WINDOWPROC
  74. //////////////////////////////////////////////////////////////////////////////
  75. LRESULT CALLBACK TheWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  76. {
  77.     //which message did we get?
  78.     switch(uMsg)
  79.     {
  80.     case WM_KEYDOWN:
  81.         {
  82.             switch(wParam)
  83.             {
  84.             case VK_ESCAPE:
  85.                 {
  86.                     DestroyWindow(hWndMain);
  87.                     return(0);
  88.                 }break;
  89.             }
  90.         }break;
  91.     case WM_LBUTTONDOWN:
  92.         {
  93.             //change the status of the map
  94.             iMap[ptCursor.x][ptCursor.y]=1-iMap[ptCursor.x][ptCursor.y];
  95.             return(0);
  96.         }break;
  97.     case WM_MOUSEMOVE:
  98.         {
  99.             //grab mouse x and y
  100.             int x=LOWORD(lParam);
  101.             int y=HIWORD(lParam);
  102.  
  103.             //reset scrolling speeds to zero
  104.             ptScroll.x=0;
  105.             ptScroll.y=0;
  106.  
  107.             //left scroll?
  108.             if(x<8) ptScroll.x=x-8;
  109.  
  110.             //upward scroll?
  111.             if(y<8) ptScroll.y=y-8;
  112.  
  113.             //right scroll?
  114.             if(x>=632) ptScroll.x=x-632;
  115.  
  116.             //downward scroll?
  117.             if(y>=472) ptScroll.y=y-472;
  118.         }break;
  119.     case WM_DESTROY://the window is being destroyed
  120.         {
  121.  
  122.             //tell the application we are quitting
  123.             PostQuitMessage(0);
  124.  
  125.             //handled message, so return 0
  126.             return(0);
  127.  
  128.         }break;
  129.     case WM_PAINT://the window needs repainting
  130.         {
  131.             //a variable needed for painting information
  132.             PAINTSTRUCT ps;
  133.             
  134.             //start painting
  135.             HDC hdc=BeginPaint(hwnd,&ps);
  136.  
  137.             /////////////////////////////
  138.             //painting code would go here
  139.             /////////////////////////////
  140.  
  141.             //end painting
  142.             EndPaint(hwnd,&ps);
  143.                         
  144.             //handled message, so return 0
  145.             return(0);
  146.         }break;
  147.     }
  148.  
  149.     //pass along any other message to default message handler
  150.     return(DefWindowProc(hwnd,uMsg,wParam,lParam));
  151. }
  152.  
  153.  
  154. //////////////////////////////////////////////////////////////////////////////
  155. //WINMAIN
  156. //////////////////////////////////////////////////////////////////////////////
  157. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
  158. {
  159.     //assign instance to global variable
  160.     hInstMain=hInstance;
  161.  
  162.     //create window class
  163.     WNDCLASSEX wcx;
  164.  
  165.     //set the size of the structure
  166.     wcx.cbSize=sizeof(WNDCLASSEX);
  167.  
  168.     //class style
  169.     wcx.style=CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  170.  
  171.     //window procedure
  172.     wcx.lpfnWndProc=TheWindowProc;
  173.  
  174.     //class extra
  175.     wcx.cbClsExtra=0;
  176.  
  177.     //window extra
  178.     wcx.cbWndExtra=0;
  179.  
  180.     //application handle
  181.     wcx.hInstance=hInstMain;
  182.  
  183.     //icon
  184.     wcx.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  185.  
  186.     //cursor
  187.     wcx.hCursor=LoadCursor(NULL,IDC_ARROW);
  188.  
  189.     //background color
  190.     wcx.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
  191.  
  192.     //menu
  193.     wcx.lpszMenuName=NULL;
  194.  
  195.     //class name
  196.     wcx.lpszClassName=WINDOWCLASS;
  197.  
  198.     //small icon
  199.     wcx.hIconSm=NULL;
  200.  
  201.     //register the window class, return 0 if not successful
  202.     if(!RegisterClassEx(&wcx)) return(0);
  203.  
  204.     //create main window
  205.     hWndMain=CreateWindowEx(0,WINDOWCLASS,WINDOWTITLE, WS_POPUP | WS_VISIBLE,0,0,320,240,NULL,NULL,hInstMain,NULL);
  206.  
  207.     //error check
  208.     if(!hWndMain) return(0);
  209.  
  210.     //if program initialization failed, then return with 0
  211.     if(!Prog_Init()) return(0);
  212.  
  213.     //message structure
  214.     MSG msg;
  215.  
  216.     //message pump
  217.     for(;;)    
  218.     {
  219.         //look for a message
  220.         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  221.         {
  222.             //there is a message
  223.  
  224.             //check that we arent quitting
  225.             if(msg.message==WM_QUIT) break;
  226.             
  227.             //translate message
  228.             TranslateMessage(&msg);
  229.  
  230.             //dispatch message
  231.             DispatchMessage(&msg);
  232.         }
  233.  
  234.         //run main game loop
  235.         Prog_Loop();
  236.     }
  237.     
  238.     //clean up program data
  239.     Prog_Done();
  240.  
  241.     //return the wparam from the WM_QUIT message
  242.     return(msg.wParam);
  243. }
  244.  
  245. //////////////////////////////////////////////////////////////////////////////
  246. //INITIALIZATION
  247. //////////////////////////////////////////////////////////////////////////////
  248. bool Prog_Init()
  249. {
  250.     //create IDirectDraw object
  251.     lpdd=LPDD_Create(hWndMain,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT);
  252.  
  253.     //set display mode
  254.     lpdd->SetDisplayMode(640,480,16,0,0);
  255.  
  256.     //create primary surface
  257.     lpddsMain=LPDDS_CreatePrimary(lpdd,1);
  258.  
  259.     //get back buffer
  260.     lpddsBack=LPDDS_GetSecondary(lpddsMain);
  261.  
  262.     //create clipper
  263.     lpdd->CreateClipper(0,&lpddClip,NULL);
  264.  
  265.     //associate window with the clipper
  266.     lpddClip->SetHWnd(0,hWndMain);
  267.  
  268.     //attach clipper to back buffer
  269.     lpddsBack->SetClipper(lpddClip);
  270.  
  271.     //load in the mousemap
  272.     MouseMap.Load("MouseMap.bmp");
  273.  
  274.     //set up the tile plotter
  275.     TilePlotter.SetMapType(ISOMAP_STAGGERED);//diamond mode
  276.     TilePlotter.SetTileSize(MouseMap.GetWidth(),MouseMap.GetHeight());//grab width and height from mousemap
  277.  
  278.     //set up tile walker to diamond mode
  279.     TileWalker.SetMapType(ISOMAP_STAGGERED);
  280.  
  281.     //set up screeen space
  282.     RECT rcTemp;
  283.     SetRect(&rcTemp,0,0,640,480);
  284.     Scroller.SetScreenSpace(&rcTemp);
  285.  
  286.     //load in tiles and cursor
  287.     tsBack.Load(lpdd,"backgroundts.bmp");
  288.     tsShadow.Load(lpdd,"treeshadowts.bmp");
  289.     tsTree.Load(lpdd,"treets.bmp");
  290.     tsCursor.Load(lpdd,"cursor.bmp");
  291.  
  292.     //grab tile extent from tileset
  293.     CopyRect(&rcTemp,&tsBack.GetTileList()[0].rcDstExt);
  294.  
  295.     //calculate the worldspace
  296.     Scroller.CalcWorldSpace(&TilePlotter,&rcTemp,MAPWIDTH,MAPHEIGHT);
  297.  
  298.     //calculate the mousemap reference point
  299.     MouseMap.CalcReferencePoint(&TilePlotter,&rcTemp);
  300.  
  301.     //calculate anchor space
  302.     Scroller.CalcAnchorSpace();
  303.  
  304.     //set wrap modes for scroller
  305.     Scroller.SetHWrapMode(WRAPMODE_CLIP);
  306.     Scroller.SetVWrapMode(WRAPMODE_CLIP);
  307.  
  308.     //set scroller anchor to (0,0)
  309.     Scroller.GetAnchor()->x=0;
  310.     Scroller.GetAnchor()->y=0;
  311.  
  312.     //attach scrolelr and tilewalker to mousemap
  313.     MouseMap.SetScroller(&Scroller);
  314.     MouseMap.SetTileWalker(&TileWalker);
  315.  
  316.     //set up the map to a random tilefield
  317.     for(int x=0;x<MAPWIDTH;x++)
  318.     {
  319.         for(int y=0;y<MAPHEIGHT;y++)
  320.         {
  321.             iMap[x][y]=rand()%2;
  322.         }
  323.     }
  324.  
  325.     return(true);//return success
  326. }
  327.  
  328. //////////////////////////////////////////////////////////////////////////////
  329. //CLEANUP
  330. //////////////////////////////////////////////////////////////////////////////
  331. void Prog_Done()
  332. {
  333.     //release main/back surfaces
  334.     LPDDS_Release(&lpddsMain);
  335.  
  336.     //release clipper
  337.     LPDDCLIP_Release(&lpddClip);
  338.  
  339.     //release directdraw
  340.     LPDD_Release(&lpdd);
  341. }
  342.  
  343. //////////////////////////////////////////////////////////////////////////////
  344. //MAIN GAME LOOP
  345. //////////////////////////////////////////////////////////////////////////////
  346. void Prog_Loop()
  347. {
  348.     //clear out backbuffer
  349.     DDBLTFX ddbltfx;
  350.     DDBLTFX_ColorFill(&ddbltfx,0);
  351.     lpddsBack->Blt(NULL,NULL,NULL,DDBLT_WAIT | DDBLT_COLORFILL,&ddbltfx);
  352.     
  353.     //move the anchor based on scrolling speed
  354.     Scroller.MoveAnchor(ptScroll.x,ptScroll.y);
  355.  
  356.     //plot our tiles
  357.     POINT ptPlot;
  358.     POINT ptMap;
  359.     for(ptMap.y=0;ptMap.y<MAPHEIGHT;ptMap.y++)
  360.     {
  361.         for(ptMap.x=0;ptMap.x<MAPWIDTH;ptMap.x++)
  362.         {
  363.             //plot the tile
  364.             ptPlot=TilePlotter.PlotTile(ptMap);
  365.  
  366.             //convert from world to screen
  367.             ptPlot=Scroller.WorldToScreen(ptPlot);
  368.  
  369.             //put the background
  370.             tsBack.PutTile(lpddsBack,ptPlot.x,ptPlot.y,0);
  371.  
  372.             //check for cursor plotting
  373.             if(ptMap.x==ptCursor.x && ptMap.y==ptCursor.y)
  374.             {
  375.                 tsCursor.PutTile(lpddsBack,ptPlot.x,ptPlot.y,0);
  376.             }
  377.  
  378.             //check for tree
  379.             if(iMap[ptMap.x][ptMap.y]==1)
  380.             {
  381.                 //put shadow
  382.                 tsShadow.PutTile(lpddsBack,ptPlot.x,ptPlot.y,0);
  383.                 //put tree
  384.                 tsTree.PutTile(lpddsBack,ptPlot.x,ptPlot.y,0);
  385.             }
  386.         }
  387.     }
  388.  
  389.     //grab the mouse position
  390.     POINT ptMouse;
  391.     GetCursorPos(&ptMouse);
  392.     //map the mouse
  393.     ptCursor=MouseMap.MapMouse(ptMouse);
  394.  
  395.     //clip the cursor to valid map coordinates
  396.     if(ptCursor.x<0) ptCursor.x=0;
  397.     if(ptCursor.y<0) ptCursor.y=0;
  398.     if(ptCursor.x>(MAPWIDTH-1)) ptCursor.x=MAPWIDTH-1;
  399.     if(ptCursor.y>(MAPHEIGHT-1)) ptCursor.y=MAPHEIGHT-1;
  400.  
  401.     //flip to show the back buffer
  402.     lpddsMain->Flip(0,DDFLIP_WAIT);
  403. }
  404.  
  405.